package org.example.mapper;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.example.pojo.User;

import java.util.List;

/**
* ClassName: UserMapper 
* Package: org.example.mapper  
* Description:
* @Author liu
* @Create 2025/5/21 21:09
* @ Version 1.0  
*/

@Mapper
public interface UserMapper {

    /**
     * 方法一：使用注释:@Select @Delete @Update @Insert
     *
     * 方法二：使用XML
     *
     */

    /**
     * 查询所有
     */
    //@Select("select * from user")
    public List<User> findAll();

    /**
     * 根据id删除
     */
    //方法一：
    @Delete("delete from user where id= 5")
    public void delect();

    //方法二：推荐，使用了预编译 #{}
    //@Delete("delete from user where id=#{id}")
    public void delectByid(Integer id);//使用实体类的属性名

    //在mybatis中，提供二个符号：
    //                        #{} 占位符 会替换为 ？ 用于参数值传递 推荐
    //                        ${} 拼接符 直接将参数拼接到sql中，不建议使用，不安全，容易sql注入


    /**
     * 添加用户
     */
    @Insert("insert into user(username,password,name,age) value(#{username},#{password},#{name},#{age})")
    public void insrert(User user);
    //如果要传递多个参数，就将其封装到一个对象中，
    //如果是单一的参数，直接传递即可(在官方的SpringBoot可以)，但如果不是，则用注释的方式@Param("username")，一一对应


    /**
     * 修改用户
     */
    @Update("update user  set username =#{username},password =#{password},name=#{name},age=#{age} where id=#{id}")
    public  void update(User user);


    /**
     * 查询用户
     */
    @Select("select * from user where id = #{id} and password=#{password}")
    public User findById(@Param("id")Integer id,@Param("password") String password);
    //@param注解的作用是为接口的方法形参起名字的。
    //（由于用户名唯一的，所以查询返回的结果最多只有一个，可以直接封装到一个对象中）






}
